package com.lmk.dsa.struct.heap;

import com.lmk.dsa.struct.commons.KvNode;

/**
 * 二叉堆
 * @author LaoMake
 * @since 1.0
 */
public interface Heap {

    /**
     * 获取树中节点的总数
     * @return
     */
    int size();

    /**
     * 判断当前堆是否为空
     * @return
     */
    boolean isEmpty();

    /**
     * 添加数据节点
     * @param node
     */
    void add(KvNode node);

    /**
     * 添加数据节点
     * @param key
     * @param value
     * @param <K>
     * @param <V>
     */
    <K extends Comparable<? super K>, V> void add(K key, V value);

    /**
     * 获取堆顶元素，并将其移除
     * @return
     */
    KvNode pool();

    /**
     * 判断堆中是否包含指定的key
     * @param key
     * @param <K>
     * @param <V>
     * @return
     */
    <K extends Comparable<? super K>, V> boolean contain(K key);

    /**
     * 更新指定key的值
     * @param key
     * @param value
     * @param <K>
     * @param <V>
     */
    <K extends Comparable<? super K>, V> void change(K key, V value);

    /**
     * 返回排序后的结果，注意：排序后就已经不满足堆特性了
     * @return
     */
    KvNode[] sort();
}
